package com.and9.mchen.mcmusic.dao;

import java.util.List;

import com.and9.mchen.mcmusic.entity.MusicStyle;
import com.and9.mchen.mcmusic.exception.DaoException;

/**
 * 
 * @author MC
 * @version  1.0
 */
public interface IMusicStyleDao extends IBaseEntityDao{

	String[] BASEPROPERTYNAMES={"styleName", "styleInfo"};
	
	/**
	 * <p>
	 * 如果musicStyle对象为null<br/>
	 * 则返回-1
	 * </p>
	 * <p>
	 * 保存对象到数据库的时候，musicStyle的id为null或者0即可<br/>
	 * 保存对象时，propertyNames只要传null即可<br/>
	 * </p>
	 * <p>
	 * 更新对象的时候，不准更新musicStyle父类的属性<br/>
	 * 如果存在父类属性，则会修改propertyNames属性为musicStyle属性
	 * </p>
	 * @param musicStyle
	 * @param propertyNames
	 * @return
	 * 返回创建或更新对象<tt>musicStyle</tt>成功次数
	 * @throws DaoException
	 */
	int createOrUpdateMusicStyle(MusicStyle musicStyle, String... propertyNames) throws DaoException;
	
	/**
	 * <p>
	 * musicStyle对象不能为null musicStyle的集合singers也不能为null<br/>
	 * 如果musicStyle、 singers里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * @param musicStyle
	 * @return
	 * 返回创建根据<tt>musicStyle</tt>创建singer与<tt>musicStyle</tt>关系的成功次数
	 * @throws DaoException
	 */
	int[] createSingerMusicStyleRelevanceByMusicStyle(MusicStyle musicStyle) throws DaoException;
	
	/**
	 * <p>
	 * musicStyle对象不能为null musicStyle的集合songs也不能为null<br/>
	 * 如果musicStyle、 songs里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>
	 * @param song
	 * @return
	 * 返回创建根据<tt>musicStyle</tt>创建song与<tt>musicStyle</tt>关系的成功次数
	 * @throws DaoException
	 */
	int[] createSongMusicStyleRelevanceByMusicStyle(MusicStyle musicStyle) throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0</br>
	 * 则返回-1
	 * </p>
	 * @param id
	 * @return
	 * 返回根据musicStyle的<tt>id</tt>删除musicStyle的成功次数
	 * @throws DaoException
	 */
	int deleteMusicStyleByMusicStyleId(long id) throws DaoException;
	
	/**
	 * 返回所有的musicStyles
	 * @return
	 * 返回所有的<tt>musicStyle</tt>
	 * @throws DaoException
	 */
	List<MusicStyle> getAllMusicStyles() throws DaoException;
	
	/**
	 * <p>
	 * 返回数据表的musicStyle的总个数
	 * </p>
	 * @return
	 * 返回数据表的<tt>musicStyle</tt>的总个数
	 * @throws DaoException
	 */
	long getAllMusicStylesCount() throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0 <br/>
	 * 返回null
	 * </p>
	 * @param id
	 * @return
	 * 根据singer的<tt>id</tt>返回musicStyles<br/>
	 * @throws DaoException
	 */
	List<MusicStyle> getMusicStrylesBySingerId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0<br/>
	 * 则返回null
	 * </p>
	 * <p>
	 * 如果返回结果为null 且 id > 0 <br/>
	 * 意味不存在该对象在此数据库
	 * </p>
	 * @param id
	 * @return
	 * 返回根据musicStyle的<tt>id</tt>查找对象musicStyle
	 * @throws DaoException
	 */
	MusicStyle getMusicStyleByMusicStyleId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 如果uniqueId 是 null<br/>
	 * 则返回null
	 * </p> 
	 * @param uniqueId
	 * @return
	 * 根据musciStyle的<tt>uniqueId</tt>查找musciStyle<br/>
	 * 查找失败返回null
	 * @throws DaoException
	 */
	MusicStyle getMusicStyleByMusicStyleUniqueId(String uniqueId) throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0 <br/>
	 * 返回null
	 * </p>
	 * @param id
	 * @return
	 * 根据song的<tt>id</tt>返回musicStyles<br/>
	 * @throws DaoException
	 */
	List<MusicStyle> getMusicStylesBySongId(long id) throws DaoException;
	
	/**
	 * <p>
	 * musicStyle对象不能为null musicStyle的集合singers也不能为null<br/>
	 * 如果musicStyle、 singers里的各个id <= 0 或null且 uniqueId不合法<br/>
	 * 返回  null 
	 * @param musicStyle
	 * @return
	 * 返回去除根据<tt>musicStyle</tt>创建singer与<tt>musicStyle</tt>关系的成功次数
	 * @throws DaoException
	 */
	int[] removeSingerMusicStyleRelevanceByMusicStyle(MusicStyle musicStyle) throws DaoException;
	
	/**
	 * <p>
	 * musicStyle对象不能为null musicStyle的集合songs也不能为null<br/>
	 * 如果musicStyle、 songs里的各个id <= 0 或null 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>
	 * @param song
	 * @return
	 * 返回去除根据<tt>musicStyle</tt>创建song与<tt>musicStyle</tt>关系的成功次数
	 * @throws DaoException
	 */
	int[] removeSongMusicStyleRelevanceByMusicStyle(MusicStyle musicStyle) throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0 <br/>
	 * 返回null
	 * </p>
	 * @param id
	 * @return
	 * 根据album的<tt>id</tt>返回musicStyles<br/>
	 * @throws DaoException
	 */
	List<MusicStyle> getMusicStylesByAlbumId(long id) throws DaoException;
	
}
